/**
 * 简单的层级互斥锁的实现
 * 
 * thread_local  关键字修饰的变量具有线程（thread）周期，这些变量在线程开始的时候被生成，在线程结束的时候被销毁，并且每一个线程都拥有一个独立的变量实例;
 *              一般用于需要保证线程安全的函数中
 */

#include <mutex>
#include <stdexcept>
#include <climits>

class hierarchical_mutex  // 分层锁
{
    std::mutex internal_mutex;  //锁
    unsigned long const hierarchy_value;  //层级值
    unsigned long previous_hierarchy_value;  //上衣层级值
    static thread_local unsigned long this_thread_hierarchy_value;  //当前线程的层级值

    void check_for_hierarchy_violation()  //检查层级冲突
    {
        if(this_thread_hierarchy_value <= hierarchy_value)  //如果
        {
            throw std::logic_error("mutex hierarchy violated");
        }
    }
    void update_hierarchy_value()  //更新层级值
    {
        previous_hierarchy_value=this_thread_hierarchy_value;
        this_thread_hierarchy_value=hierarchy_value;
    }
public:
    explicit hierarchical_mutex(unsigned long value):
        hierarchy_value(value),
        previous_hierarchy_value(0)
    {}
    void lock()
    {
        check_for_hierarchy_violation();
        internal_mutex.lock();
        update_hierarchy_value();
    }
    void unlock()
    {
        this_thread_hierarchy_value=previous_hierarchy_value;
        internal_mutex.unlock();
    }
    bool try_lock()
    {
        check_for_hierarchy_violation();
        if(!internal_mutex.try_lock())
            return false;
        update_hierarchy_value();
        return true;
    }
};
thread_local unsigned long
    hierarchical_mutex::this_thread_hierarchy_value(ULONG_MAX);       

//ULONG_MAX 用于获取 unsigned long int 对象的最大值，它返回一个 unsigned long int 对象可以存储的最大值
//thread_local
int main()
{
    hierarchical_mutex m1(42);
    hierarchical_mutex m2(2000);
    
}
